// class 定义类名
class Person {
    name: string
    age: number
    // conconstructor  构造器关键字
    constructor(name: string, age: number) {
        this.name = name
        this.age = age
    }
    speak(){
        console.log(`我叫${this.name},今年${this.age}岁`);
    }
    aaa(){
        console.log(`我是父类方法`);
    }
}
// 用关键字new 去使用类
const p1 = new Person('夜南',26)
console.log('看一下类的数据结构',p1);

p1.speak()


// 类的继承
// class aaa extends bbb,这样aaa就可以继承bbb的所有属性
class Student extends Person {
    study(){
        console.log('我是Student独有的study方法');
    }
    unit:string
    constructor(name: string, age: number,unit:string) {
        // super() 继承的类在自己使用constructor构造器定义新的变量时，需要使用super()把父类的属性传递过去
        super(name,age)
        this.unit = unit
    }
    // 重写父类方法：使用override关键字进行重写，也可以不写override关键字，
    override speak(){
        console.log(`我是子类,我叫${this.name},今年${this.age}岁,我在${this.unit}上学`);
    }
    // 不写关键字时，如果子类的方法名和父类的方法名一致，则子类方法会覆盖父类方法，推荐重写的时候写上关键字，不然打错字了就是一个新的方法
    aaa(){
        console.log(`我是子类方法,我把父类覆盖了`);
    }
}

const s1 = new Student('学生夜南',18,'血刃酒馆')
console.log('我是学生Student类',s1);
s1.speak()
